package DoblePointer;//给定一个字符串，验证它是否是回文串，只考虑字母和数字字符，可以忽略字母的大小写。
//
// 说明：本题中，我们将空字符串定义为有效的回文串。 
//
// 
//
// 示例 1: 
//
// 
//输入: "A man, a plan, a canal: Panama"
//输出: true
//解释："amanaplanacanalpanama" 是回文串
// 
//
// 示例 2: 
//
// 
//输入: "race a car"
//输出: false
//解释："raceacar" 不是回文串
// 
//
// 
//
// 提示： 
//
// 
// 1 <= s.length <= 2 * 10⁵ 
// 字符串 s 由 ASCII 字符组成 
// 
// Related Topics 双指针 字符串 👍 420 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
class isPalindrome {
    public static boolean isPalindrome(String s) {
        if(s==null || s.length()==0){
            return true;
        }
        int left = 0;
        int right = s.length()-1;
        //
        while(left<right){
            //若当前字符不符合要求
            while(left<right && !isCharacterOrDigit(s.charAt(left))){
                left++;
            }
            while(left<right && !isCharacterOrDigit(s.charAt(right))){
                right--;
            }
            if(getLower(s.charAt(left))!=getLower(s.charAt(right))){
                return false;
            }
            left++;
            right--;

        }

        return true;


    }
    //获得小写字母
    private static char getLower(char c){
        //已经小写，不需要转化
        if(c>='a' && c<='z'){
            return c;
        }

        return (char)(c+32);

    }

    //自定义判断只取字母或数字字符
    private static boolean isCharacterOrDigit(char c){
        if(c-'0'>= 0 && c-'0'<=9){
            return true;
        }
        if(c>='a' && c<='z'){
            return true;
        }
        if(c>='A' && c<='Z'){
            return true;
        }
        return false;
    }
}
//leetcode submit region end(Prohibit modification and deletion)
